#ifndef OUTPUT_DEVICE_VISITOR_H
#define OUTPUT_DEVICE_VISITOR_H

#include "sceneelement.h"
#include "output_device.h"
#include "output_device_visitor_interface.h"

class OutputDeviceVisitor : public OutputDeviceVisitorInterface
{
public:
  OutputDeviceVisitor(OutputDevice& dev) : device(dev) {}
  void visit(const Sphere* o) { device.drawSphere(*o); }
  void visit(const Ellipsoid* o) { device.drawEllipsoid(*o); }
  void visit(const Cylinder* o) { device.drawCylinder(*o); }
  void visit(const Cone* o) { device.drawCone(*o); }
  void visit(const Paralelepiped* o) { device.drawParalelepiped(*o); }
  void visit(const Surface* o) { device.drawSurface(*o); }
  void visit(const Point* o) { device.drawPoint(*o); }
  void visit(const Line* o) { device.drawLine(*o); }
  void visit(const Text* o) { device.drawText(*o); }

  void visit(const SceneElement* ) { std::cerr << "OutputDeviceVisitor: visiting SceneElement" << std::endl; throw "Error"; }
private:
  OutputDevice& device;
};

#endif // OUTPUT_DEVICE_VISITOR_H
